home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / UI / IdleList.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  8.1 KB  |  307 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        IdleList.cpp
  3.  
  4.     Contains:    IdleList and IdleListIterator classes.
  5.  
  6.     Owned by:    Richard Rodseth
  7.  
  8.     Copyright:    © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <7>     5/26/95    RR        #1251403: Multithreading naming support
  13.          <6>     5/25/95    jpa        List.h --> LinkList.h [1253324]
  14.          <5>      4/4/95    RR        #1220104 Use if IsEqual , # 1228161
  15.                                     RegisterIdle updates frequency if called
  16.                                     twice
  17.          <4>     1/31/95    RR        # 1206909 Rewrote AddIdle/RemoveIdle to
  18.                                     allow unregister while idling, and
  19.                                     immediate unregister/reregister
  20.          <3>     9/30/94    RR        #1167950 Allow unregistering while idling.
  21.                                     Unregistering simply flags items, and
  22.                                     RemoveUnregisteredIdlers removes them
  23.          <2>     9/20/94    RR        #1154046 Moved ref counting from Dispatcher
  24.                                     into IdleList methods so that an
  25.                                     unregistered part is not released.
  26.          <1>     5/13/94    RR        first checked in
  27.          <4>      2/7/94    NP        Tiger Team doings.
  28.          <3>    12/20/93    RR        interface takes part/frame pairs rather
  29.                                     than frames
  30.          <2>     12/3/93    TÇ        Stop including ODError.h, it is included
  31.                                     as ErrorDef.h inside Except.h
  32.          <1>    11/16/93    RR        first checked in
  33.  
  34.     To Do:
  35.     In Progress:
  36. */
  37.  
  38. #ifndef _IDLELIST_
  39. #include "IdleList.h"
  40. #endif
  41.  
  42. #ifndef _LINKLIST_
  43. #include <LinkList.h>
  44. #endif
  45.  
  46. #ifndef _FRAME_
  47. #include "Frame.xh"
  48. #endif
  49.  
  50. #ifndef _PART_
  51. #include "Part.xh"
  52. #endif
  53.  
  54. #ifndef _EXCEPT_
  55. #include "Except.h"
  56. #endif
  57.  
  58. #pragma segment IdleList
  59.  
  60. inline long Max(long a, long b)
  61. {
  62.     return a > b ? a : b;
  63. }
  64.  
  65. //======================================================================================
  66. // Class IdleInfo
  67. //======================================================================================
  68.  
  69. IdleInfo::IdleInfo(ODPart* part, ODFrame* frame, ODIdleFrequency frequency)
  70. {
  71.     fPart = part;
  72.     fFrame = frame;
  73.     fIdleFrequency = frequency;
  74.     fLastIdle = 0;
  75.     fRemove = kODFalse;
  76. }
  77.  
  78. IdleInfo::~IdleInfo()
  79. {
  80. }
  81.  
  82. ODBoolean IdleInfo::NeedsIdle(ODTicks ticks)
  83. {
  84.     return ( !fRemove && ((ticks - fLastIdle) >= fIdleFrequency));
  85. }
  86.  
  87. ODTicks IdleInfo::NextIdle(ODTicks ticks)
  88. {
  89.     if (fLastIdle == 0)
  90.         return 0;
  91.     else
  92.         return Max(fLastIdle + fIdleFrequency - ticks, 0);
  93. }
  94.  
  95.  
  96. //======================================================================================
  97. // Class IdleList
  98. //======================================================================================
  99.  
  100. IdleList::IdleList()
  101. {
  102. }
  103.  
  104. IdleList::~IdleList()
  105. {
  106.     fImplementation.DeleteAllLinks();
  107. }
  108.  
  109. //-------------------------------------------------------------------------------------
  110. // IdleList::AddIdle                
  111. //
  112. // Description
  113. //-------------------------------------------------------------------------------------
  114.  
  115. void IdleList::AddIdle(Environment* ev, ODPart* part, ODFrame* frame, ODIdleFrequency frequency) 
  116. {
  117.     LinkedListIterator iter(&fImplementation);
  118.     ODBoolean found = kODFalse;
  119.  
  120.     for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
  121.     {
  122.         // Skip links that are flagged for removal, because their references have been 
  123.         // Released, and there may not have been time to clear the flagged links,
  124.         // eg. during Revert
  125.  
  126.         found = !link->ShouldRemove() 
  127.                 && ODObjectsAreEqual(ev, link->GetFrame(), frame) 
  128.                 && ODObjectsAreEqual(ev, link->GetPart(), part);
  129.         if (found)
  130.         {
  131.             // If it's already there, update the frequency in case it's different
  132.             link->SetIdleFrequency(frequency);
  133.             link->SetLastIdle(0);
  134.             
  135.             // Redundant
  136.             // If it's already there, make sure it isn't flagged for removal
  137.             /*if (link->ShouldRemove())
  138.             {
  139.                  link->SetShouldRemove(kODFalse);
  140.                 part->Acquire(ev);
  141.                 if (frame)
  142.                     frame->Acquire(ev);
  143.              }
  144.              */
  145.             break;    
  146.         }
  147.     }
  148.     if (!found)
  149.     {
  150.         IdleInfo* link = new IdleInfo(part, frame, frequency);        
  151.         if (link)
  152.         {
  153.             fImplementation.AddLast(link);
  154.             part->Acquire(ev);
  155.             if (frame)
  156.                 frame->Acquire(ev);
  157.         }
  158.         else
  159.             THROW(kODErrOutOfMemory);
  160.     }
  161. }
  162.     
  163. //-------------------------------------------------------------------------------------
  164. // IdleList::RemoveIdle                
  165. //
  166. // Description
  167. //-------------------------------------------------------------------------------------
  168.  
  169. void IdleList::RemoveIdle(Environment* ev, ODPart* part, ODFrame* frame)
  170. {
  171.     // To allow removal while idling, we just flag
  172.     // "removed" items here.
  173.     // They are cleared by RemoveUnregisteredIdlers
  174.     
  175.     LinkedListIterator iter(&fImplementation);
  176.     ODBoolean found = kODFalse;
  177.  
  178.     for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
  179.     {
  180.         // Skip links that are flagged for removal, because their references have been 
  181.         // Released, and there may not have been time to clear the flagged links,
  182.         // eg. during Revert
  183.         found = !link->ShouldRemove() 
  184.                 && ODObjectsAreEqual(ev, link->GetFrame(), frame) 
  185.                 && ODObjectsAreEqual(ev, link->GetPart(), part);
  186.         if (found)
  187.         {
  188.             //if (link->ShouldRemove() == kODFalse)
  189.             //{
  190.                 link->SetShouldRemove(kODTrue);
  191.                 part->Release(ev);
  192.                 if (frame)
  193.                     frame->Release(ev);
  194.             //}
  195.             break;    
  196.         }
  197.     }
  198. }
  199.  
  200. //-------------------------------------------------------------------------------------
  201. // IdleList::RemoveUnregisteredIdlers                
  202. //
  203. // Description
  204. //-------------------------------------------------------------------------------------
  205.  
  206. void IdleList::RemoveUnregisteredIdlers(Environment* ev)
  207. {
  208.     LinkedListIterator iter(&fImplementation);
  209.  
  210.     for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
  211.     {
  212.         if (link->ShouldRemove())
  213.         {
  214.             iter.RemoveCurrent();
  215.             delete link;
  216.         }
  217.     }
  218. }
  219.  
  220. //-------------------------------------------------------------------------------------
  221. // IdleList::SetIdleFrequency                
  222. //
  223. // Description
  224. //-------------------------------------------------------------------------------------
  225.  
  226. void IdleList::SetIdleFrequency(Environment* ev, ODPart* part, ODFrame* frame, ODIdleFrequency frequency) 
  227. {
  228.     LinkedListIterator iter(&fImplementation);
  229.     ODBoolean found = kODFalse;
  230.  
  231.     for (IdleInfo* link = (IdleInfo*) iter.First();iter.IsNotComplete(); link = (IdleInfo*) iter.Next())
  232.     {
  233.         // Skip links that are flagged for removal, because their references have been 
  234.         // Released, and there may not have been time to clear the flagged links,
  235.         // eg. during Revert
  236.         found = !link->ShouldRemove() 
  237.                 && ODObjectsAreEqual(ev, link->GetFrame(), frame) 
  238.                 && ODObjectsAreEqual(ev, link->GetPart(), part);
  239.         if (found)
  240.         {
  241.             link->SetIdleFrequency(frequency);
  242.             link->SetLastIdle(0);
  243.             break;    
  244.         }
  245.     }
  246. }
  247.  
  248.  
  249. //=====================================================================================
  250. // IdleListIterator Methods
  251. //=====================================================================================
  252.  
  253. //-------------------------------------------------------------------------------------
  254. // IdleListIterator::IdleListIterator                
  255. //
  256. // Description
  257. //-------------------------------------------------------------------------------------
  258.  
  259. IdleListIterator::IdleListIterator(IdleList* idleList)
  260.     : fIterator(&(idleList->fImplementation))
  261. {
  262. }
  263.  
  264. //-------------------------------------------------------------------------------------
  265. // IdleListIterator::~IdleListIterator                
  266. //
  267. // Description
  268. //-------------------------------------------------------------------------------------
  269.  
  270. IdleListIterator::~IdleListIterator()
  271. {
  272. }
  273.  
  274. //-------------------------------------------------------------------------------------
  275. // IdleListIterator::First                
  276. //
  277. // Description
  278. //-------------------------------------------------------------------------------------
  279.     
  280. IdleInfo* IdleListIterator::First()
  281. {
  282.     return (IdleInfo*) fIterator.First();
  283. }
  284.  
  285. //-------------------------------------------------------------------------------------
  286. // IdleListIterator::Next                
  287. //
  288. // Description
  289. //-------------------------------------------------------------------------------------
  290.  
  291. IdleInfo* IdleListIterator::Next()
  292. {
  293.     return (IdleInfo*) fIterator.Next();
  294. }
  295.  
  296. //-------------------------------------------------------------------------------------
  297. // IdleListIterator::IsNotComplete                
  298. //
  299. // Description
  300. //-------------------------------------------------------------------------------------
  301.  
  302. ODBoolean IdleListIterator::IsNotComplete()
  303. {
  304.     return fIterator.IsNotComplete();
  305. }
  306.  
  307.